#!/usr/bin/python
# -*- coding: iso-8859-15 -*-

import commands
import re



class Iperf:
    """
    Lancement d'iperf: 
        - serveur = adresse IP du serveur hebergeant le processus serveur iperf.
        - mode = prend la valeur "tcp" si le serveur est de type tcp, ou "udp" si le serveur est de type udp. 
        - duree = donne en seconde la duree de la mesure
        - intervalle = precise l'intervalle en seconde entre les mesures.
        - debit = precise le débit d'emission pour le mode UDP en Mbit/s == !!!! doit etre recupere de iwconfig pour etre conherent
        - windows = determine la windows size pour le mode TCP en KByte.
    
    
    La taille de la fenêtre TCP corresponds aux données qui peuvent être mise en tampon pendant une connexion sans la validation du receveur.
    Elle est comprise entre 2 et 65535 bytes.
    Sur les systèmes Linux, quand on spécifie une taille de fenêtre TCP avec l'argument -w, le noyau alloue le double de la valeur indiquée.
    L'argument -t spécifie la durée du test en seconde, par défaut 10 secondes.
    L'argument -i indique l'intervalle en seconde entre les rapports périodiques de bande passante
    """
    def __init__(self,session):
        """
        Fonction d'initialisation
        """
        self.session=session
        self.su=[]
        self.u=""
        self.listdico=[]
        self.regex=""
        self.result_regex=""
        self.dico={}
        self.intervalle="10"
        self.duree="10"
        self.serveur=""
        self.mode="tcp"
        self.debit="11"
    
        

    def iperf(self,param):
        """
        La fonction permet de lancer les commandes iperf et d'en traiter les resultats.
        @param param dictionnaire iperf genere par la Page6
        """
        if param["mode"]=="tcp":
            # le resultat de cette commande renvoie avec les prefixes 4 le sens 'client->serveur' et le prefixe 5 le sens 'serveur->client'
            print 'iperf -c '+str(param["serveur"])+' -r -i '+str(param["intervalle"])+' -t '+str(param["duree"])
            self.u=commands.getoutput('iperf -c '+str(param["serveur"])+' -i '+str(param["intervalle"])+' -t '+str(param["duree"]))    
                
        if param["mode"]=="udp" :
            # le resultat de cette commande renvoie avec les prefixes 3 le sens 'client->serveur' et le prefixe 4 le sens 'serveur->client'
            print 'iperf -c '+str(param["serveur"])+' -u -i '+str(param["intervalle"])+' -t '+str(param["duree"])+' -b '+str(param["debit"])
            self.u=commands.getoutput('iperf -c '+str(param["serveur"])+' -u -r -i '+str(param["intervalle"])+' -t '+str(param["duree"])+' -b '+str(param["debit"])+'M')

        self.su=self.u.split("/sec")
        self.su.pop(0)
        ## Partie récuperant les résultats et les stockants sous forme de liste de dictionnaire avec les REGEX
        for element in self.su:
            ### RECUPERATION DE LINTERVALLE
            self.regex=re.compile('([0-9]{1,}\.[0-9]{1,}[-| ]{1,2}[0-9]{1,}\.[0-9]{1,} sec).*')
            self.result_regex=self.regex.findall(element)
            if self.result_regex :
                self.dico['intervalles']=self.result_regex[0]

            ### TRANSFERT
            self.regex=re.compile('([\.0-9]{1,} [KkMm]{1}Bytes).*')
            self.result_regex=self.regex.findall(element)
            if self.result_regex :
                self.dico['transfere']=self.result_regex[0]


            ### BANDE PASSANTE
            self.regex=re.compile('.*  ([\.0-9]{1,}.*[KkMm]{1}bits)')
            self.result_regex=self.regex.findall(element)
            if self.result_regex :
                self.dico['bande_passante']=self.result_regex[0]
                self.listdico.append(self.dico)

            self.dico={}    
        return self.listdico

if __name__=="__main__":
    test= Iperf("un")
    test.iperf()
    print test.u

